package com.such.kit.validate.validator.impl;

import java.util.List;
import com.such.kit.datacast.CastCommons;
import com.such.kit.validate.ValidateCommons;
import com.such.kit.validate.ValidateDataType;
import com.such.kit.validate.validator.Validator;

/**
 * @author SUCH
 * <pre>
 * 数字格式校验器
 * 当 value 为空返回 false
 * 
 * [参数集说明]
 * 参数集长度等于 0 时，输入内容必须为数字
 * 参数集长度等于 1 时，输入内容必须为数字，且整数部分长度必须大于 #[1]
 * 参数集长度等于 2 时，输入内容必须为数字，且整数部分长度必须介于 #[1] 和 #[2] 之间
 * 参数集长度等于 3 时，输入内容必须为数字，且整数部分长度必须介于 #[1] 和 #[2] 之间，小数部分长度必须等于 #[3]
 * 参数集长度等于 3 时，输入内容必须为数字，且整数部分长度必须介于 #[1] 和 #[2] 之间，小数部分长度必须介于 #[3] 和 #[4] 之间
 * </pre>
 */
public class NumberValidator extends Validator {

	@Override
	protected boolean checkParams(List<String> params) {
		if (params.size() == 0 || params.size() == 1 || 
				params.size() == 2 || params.size() == 3 ||
				params.size() == 4) {
			return true;
		}
		return false;
	}

	@Override
	protected boolean verify(String value, List<String> params) {
		if (ValidateCommons.isEmpty(value)) {
			return false;
		}
		if (ValidateCommons.isEmpty(params)) {
			return ValidateDataType.validateDouble(value);
		} else if (ValidateDataType.validateDouble(value)) {
			int paramsSize = params.size();
			int integerLen = 0;
			int decimalLen = 0;
			String[] valArray = value.split("\\.");
			if (valArray.length == 1) {
				integerLen = valArray[0].length();
			} else if (valArray.length == 2) {
				integerLen = valArray[0].length();
				decimalLen = valArray[1].length();
			}

			if (paramsSize == 1) {
				int min = CastCommons.stringToInteger(params.get(0));
				if (integerLen >= min) {
					return true;
				}
			} else if (paramsSize == 2) {
				int min = CastCommons.stringToInteger(params.get(0));
				int max = CastCommons.stringToInteger(params.get(1));
				if (integerLen >= min && integerLen <= max) {
					return true;
				}
			} else if (paramsSize == 3) {
				int min = CastCommons.stringToInteger(params.get(0));
				int max = CastCommons.stringToInteger(params.get(1));
				int decimal = CastCommons.stringToInteger(params.get(2));
				if (integerLen >= min && integerLen <= max && decimalLen == decimal) {
					return true;
				}
			} else if (paramsSize == 4) {
				int min = CastCommons.stringToInteger(params.get(0));
				int max = CastCommons.stringToInteger(params.get(1));
				int decimalMin = CastCommons.stringToInteger(params.get(2));
				int decimalMax = CastCommons.stringToInteger(params.get(3));
				if (integerLen >= min && integerLen <= max && decimalLen >= decimalMin && decimalLen <= decimalMax) {
					return true;
				}
			}
		}
		return false;
	}

	@Override
	protected String getVerifyMessage(List<String> params) {
		int paramsSize = params.size();
		StringBuffer message = new StringBuffer();
		if (paramsSize == 0) {
			message.append("输入内容必须为数字");
		} else if (paramsSize == 1) {
			message.append("输入内容必须为数字，且整数部分长度必须大于 #[1]");
		} else if (paramsSize == 2) {
			if (params.get(0).equals(params.get(1))) {
				message.append("输入内容必须为数字，且整数部分长度必须等于 #[1]");
			} else {
				message.append("输入内容必须为数字，且整数部分长度必须介于 #[1] 和 #[2] 之间");
			}
		} else if (paramsSize == 3) {
			if (params.get(0).equals(params.get(1))) {
				message.append("输入内容必须为数字，且整数部分长度必须等于 #[1]，小数部分长度必须等于 #[3]");
			} else {
				message.append("输入内容必须为数字，且整数部分长度必须介于 #[1] 和 #[2] 之间，小数部分长度必须等于 #[3]");
			}
		} else if (paramsSize == 4) {
			message.append("输入内容必须为数字，");
			if (params.get(0).equals(params.get(1))) {
				message.append("且整数部分长度必须等于 #[1]，");
			} else {
				message.append("且整数部分长度必须介于 #[1] 和 #[2] 之间，");
			}
			if (params.get(2).equals(params.get(3))) {
				message.append("小数部分长度必须等于 #[3]");
			} else {
				message.append("小数部分长度必须介于 #[3] 和 #[4] 之间");
			}
		}
		return message.toString();
	}

}
